<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>集合结构以及Set的实现</title>
  </head>
  <body>
    <script>
      // 封装Set类
      function Set() {
        // 创建一个对象用来保存集合的元素
        this.items = {};
        /* 集合的操作方法 */

        // 判断集合中是否包含某个元素
        Set.prototype.has = function (value) {
          return this.items.hasOwnProperty(value);
          roperty(value); // Object的hasOwnProperty()方法返回一个布尔值，判断对象是否包含特定的自身（非继承）属性。
        };

        //  向集合中添加元素
        Set.prototype.add = function (value) {
          //  判断集合中是否已经包含了元素
          if (this.has(value)) return false;
          // 将元素添加到集合中
          this.items[value] = value;
          return true;
        };

        // 从集合中删除某个元素
        Set.prototype.remove = function (value) {
          // 1.判断集合中是否包含该元素
          if (!this.has(value)) return false;
          // 2.包含该元素,那么元素将删除
          delete this.items[value];
          return true;
        };

        // 清空集合中所有的数据
        Set.prototype.clear = function () {
          this.items = {};
        };

        // size方法
        Set.prototype.size = function () {
          return Object.keys(this.items).length;
        };

        // 获取集合中所有的值
        Set.prototype.values = function () {
          return Object.keys(this.items);
        };
      }

      // 测试和使用集合类
      var set = new Set();

      // 添加元素
      set.add(1);
      alert(set.values()); // 1
      set.add(1);
      alert(set.values()); // 1

      set.add(100);
      set.add(200);
      alert(set.values()); // 1,100,200

      // 判断是否包含元素
      alert(set.has(100)); // true

      // 删除元素
      set.remove(100);
      alert(set.values()); // 1, 200

      // 获取集合的大小
      alert(set.size()); // 2
      set.clear();
      alert(set.size()); // 0
    </script>
  </body>
</html>
